package com.kuang.helperclass;

import java.util.concurrent.CountDownLatch;

/**
 * 倒计时计数器（减法计数器）
 *
 * 理解：
 *      就像保安锁门，需要等所有人都走完再锁门，如果还有人，就不能锁门
 *
 * 原理：
 *      countDownLatch.countDown();数量减一
 *      countDownLatch.await();等待计数器归0
 *      每次有线程调用 countDown()数量-1，假设计数器变为0,countDownLatch.await()就会被唤醒，继续执行
 *
 */
public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        // 总数是6
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 1; i <= 6; i++) {
            final int finalI = i;
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+ "线程走了,i="+ finalI);
                countDownLatch.countDown();//每走一个线程，数量-1
            }).start();
        }
        countDownLatch.await(); //等待计数器归0，再向下执行，本质理解：await()执行时，会判断上面线程是否执行完，没有完的话，不会切换CPU给主线程
        System.out.println(Thread.currentThread().getName()+"保安要等6个线程都执行完了，主线程关门");
        /*
            Thread-0线程走了,i=1
            Thread-4线程走了,i=5
            Thread-5线程走了,i=6
            Thread-3线程走了,i=4
            Thread-2线程走了,i=3
            Thread-1线程走了,i=2
            main保安要等6个线程都执行完了，主线程关门
         */
    }
}
